/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.tesoreria.bc;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TemporalType;
import org.cip.esymons.tesoreria.be.ValorCuenta;

/**
 *
 * @author Administrador
 */
@Stateless
public class ValorCuentaFacade implements ValorCuentaFacadeLocal {

    @PersistenceContext
    private EntityManager em;

    public void create(ValorCuenta valorCuenta) {
        em.persist(valorCuenta);
    }

    public void edit(ValorCuenta valorCuenta) {
        em.merge(valorCuenta);
    }

    public void remove(ValorCuenta valorCuenta) {
        em.remove(em.merge(valorCuenta));
    }

    public ValorCuenta find(Object id) {
        try {
            return em.find(ValorCuenta.class, id);
        } catch (Exception e) {
            return null;
        }
    }

    public List<ValorCuenta> findAll() {
        try {
            return em.createQuery("select object(o) from ValorCuenta as o").getResultList();
        } catch (Exception e) {
            return new ArrayList();
        }
    }

    public List<ValorCuenta> valorCuentaIngreso(String codigo, Date fechaIni, Date fechaFin) {
        try {
            StringBuilder sb = new StringBuilder();
            sb.append(" Select o ");
            sb.append(" From ValorCuenta o");
            sb.append(" Where o.fkCinCodigo.cinCodigo=?1 ");
            sb.append(" and ( ?2 between o.vcuFechinicio and o.vcuFechfin) and ( ?3 between o.vcuFechinicio and o.vcuFechfin)");
            Query q = em.createQuery(sb.toString());
            q.setParameter(1, codigo);
            q.setParameter(2, fechaIni, TemporalType.DATE);
            q.setParameter(3, fechaFin, TemporalType.DATE);

            return q.getResultList();
        } catch (Exception ex) {
            return null;
        }
    }

    public ValorCuenta valorCuentaActual(String codigo) {
        try {
            StringBuilder sb = new StringBuilder();
            sb.append(" Select o ");
            sb.append(" From ValorCuenta o");
            sb.append(" Where o.fkCinCodigo.cinCodigo=?1 ");
            sb.append(" and o.vcuFechfin is null");
            Query q = em.createQuery(sb.toString());
            q.setParameter(1, codigo);
            return (ValorCuenta) q.getSingleResult();
        } catch (Exception ex) {
            return null;
        }
    }

    
    public ValorCuenta valorCuentaAnterior(String codigo, Date fecha) {
        try {
            StringBuilder sb = new StringBuilder();
            sb.append(" Select o ");
            sb.append(" From ValorCuenta o");
            sb.append(" Where o.fkCinCodigo.cinCodigo=?1 ");
            if (fecha != null) {
                sb.append(" and ?1 between o.vcuFechinicio and o.vcuFechfin");
            } else {
                sb.append(" order by o.o.vcuFechinicio desc");
            }
            Query q = em.createQuery(sb.toString());
            q.setParameter(1, codigo);
            if (fecha != null) {
                q.setParameter(2, fecha, TemporalType.DATE);
            }
            return (ValorCuenta) q.getResultList().get(0);
        } catch (Exception ex) {
            return null;
        }
    }

    public List<ValorCuenta> paginadorValorCuenta(int cantidad, int posicion, String codCuentaIngreso, Date fecini, Date fecfin) {
        try {
            Query q = null;
            StringBuilder sb = new StringBuilder();
            sb.append("Select vc From ValorCuenta vc ");
            Integer cont = 0;
            if (codCuentaIngreso != null && !codCuentaIngreso.isEmpty()) {
                sb.append(" Where ");
                sb.append(" vc.fkCinCodigo.cinCodigo = ?").append((++cont).toString());
            }
            if (fecini != null) {
                if (cont.equals(0)) {
                    sb.append(" Where ");
                } else {
                    sb.append(" and ");
                }
                sb.append(" vc.vcuFechinicio = ?").append((++cont).toString());
            }
            if (fecfin != null) {
                if (cont.equals(0)) {
                    sb.append(" Where ");
                } else {
                    sb.append(" and ");
                }
                sb.append(" vc.vcuFechfin = ?").append((++cont).toString());
            }
            q = em.createQuery(sb.toString());
            cont = 0;
            if (codCuentaIngreso != null && !codCuentaIngreso.isEmpty()) {
                q.setParameter(++cont, codCuentaIngreso);
            }
            if (fecini != null) {
                q.setParameter(++cont, fecini);
            }
            if (fecfin != null) {
                q.setParameter(++cont, fecfin);
            }
            q.setFirstResult(posicion);
            q.setMaxResults(cantidad);
            return q.getResultList();
        } catch (Exception ex) {
            return new ArrayList();
        }

    }

    public int contarPaginadorValorCuenta(String codCuentaIngreso, Date fecini, Date fecfin) {
        try {
            Query q = null;
            StringBuilder sb = new StringBuilder();
            sb.append("Select count(vc) From ValorCuenta vc ");
            Integer cont = 0;
            if (codCuentaIngreso != null && !codCuentaIngreso.isEmpty()) {
                sb.append(" Where ");
                sb.append(" vc.fkCinCodigo.cinCodigo = ?").append((++cont).toString());
            }
            if (fecini != null) {
                if (cont.equals(0)) {
                    sb.append(" Where ");
                } else {
                    sb.append(" and ");
                }
                sb.append(" vc.vcuFechinicio = ?").append((++cont).toString());
            }
            if (fecfin != null) {
                if (cont.equals(0)) {
                    sb.append(" Where ");
                } else {
                    sb.append(" and ");
                }
                sb.append(" vc.vcuFechfin = ?").append((++cont).toString());
            }
            q = em.createQuery(sb.toString());
            cont = 0;
            if (codCuentaIngreso != null && !codCuentaIngreso.isEmpty()) {
                q.setParameter(++cont, codCuentaIngreso);
            }
            if (fecini != null) {
                q.setParameter(++cont, fecini);
            }
            if (fecfin != null) {
                q.setParameter(++cont, fecfin);
            }
            return new Integer(q.getSingleResult().toString());
        } catch (Exception ex) {
            return 0;
        }
    }
}
